\section{Introduction}

A distributed key-value service system without persistent storage and
the support of atomic transactions is incomplete. In the case of a
group power failure, the system certainly loses its key-value data. A
general key-value service should also support atomic transactions. For
example in a social network application, if a user accepts a friend
request, the backend service should update two users' friend lists
simultaneously and consistently.

The goal of this work is to extend ShardKV to survive from power
failure or system crash and to add atomic transaction features
without loss of performance. The challenge and ``contribution''
of this work are as follows:

\begin{itemize}
\item ShardKV++ possesses a persistent Paxos service.  Updating Paxos
states to disk is done atomically (rollback is done when the write
fails).
\item ShardKV++ provides multiple-puts transaction.  Two-phase commit
and persistent Paxos log make transactions atomic and fault-tolerant.
\item ShardKV++ passes all tests of Lab 3/4 as well as additional tests
for persistent storage and concurrent operations with transactions.
[Performance?]
\end{itemize}

The rest of the report is organized as follows. Section 2 presents the
current design and implementation of ShardKV++. We also discuss
designs and techniques we considered to improve our current
implementation. Section 3 presents ideas and cases we implement to
test ShardKV++.
